package org.pb.org.controller;

import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.pb.basic.utils.AjaxResult;
import org.pb.basic.utils.PageList;
import org.pb.org.domain.Shop;
import org.pb.org.query.ShopQuery;
import org.pb.org.service.IShopService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * 店铺的控制器【api接口类】
 * @author
 */
@RestController
@RequestMapping("/shop")
@Api(tags = "店铺接口", description = "店铺接口的详细作用")
public class ShopController {

    @Autowired
    private IShopService shopService;

    /**
     * 获取并返回所有店铺数据。
     * 使用GetMapping 对应前端的get请求 【restful】
     * @return 所有店铺的数据信息
     */
    @GetMapping
    @ApiOperation(value = "查询信息", notes = "获取到店铺的所有信息")
    public List<Shop> findAll() {
        return shopService.findAll();
    }

    /** nsd
     * 获取并返回指定id的店铺数据
     * 同样是get请求，但是这里需要传递参数，采用springmvc四种取参方式的最后一个，url取参。
     * GetMapping(/{参数名}) 在形参列表中(@PathVariable("参数名") 数据类型 形参名【一般和参数名一致】)
     * 请求映射可以不是GetMapping
     * @return 特定的店铺数据
     */
    @GetMapping("/{id}")
    @ApiOperation(value = "获取单个信息", notes = "根据id获取到单个店铺数据")
    public Shop getById(@PathVariable("id") Long id) {
        return shopService.getById(id);
    }


    /**
     * 根据条件获取到对应的分页数据并返回
     * 因为查询条件偏多，通过url取参不方便，所以采用post数据包形式取参【请求体中】
     * 后端通过RequestBody获取到请求体中的参数，然后封装到query对象中 (@RequestBody ShopQuery shopQuery)
     * @return 店铺数据的分页查询列表
     */
    @PostMapping
    @ApiOperation(value = "分页查询", notes = "根据分页信息查询对应的店铺数据")
    public PageList<Shop> getByQuery(@RequestBody ShopQuery shopQuery) {
        return shopService.findByQuery(shopQuery);
    }

    /**
     * 根据id删除对应的店铺数据
     * 因为是删除方法，所以使用deleteMapping。
     * 因为只有一个id参数，所以使用url取参的方式
     * @param id 要删除的店铺信息的id
     * @return 删除操作的成功状态码和反馈消息
     */
    @DeleteMapping("/{id}")
    @ApiOperation(value = "删除信息", notes = "根据店铺id删除对应的店铺信息")
    public AjaxResult remove(@PathVariable("id") Long id) {
        try {
            shopService.remove(id);
            return AjaxResult.successWithMessage("删除成功");
        } catch (Exception e) {
            e.printStackTrace();
            return AjaxResult.failedWithMessage(e.getMessage());
        }
    }

    /**
     * 因为是修改或者保存数据，所以这里采用PutMapping进行方法映射。
     * 由于传入的参数过多，所以采用请求体传参。
     * 通过requestBody取参
     * @param shop
     * @return
     */
    @PutMapping
    @ApiOperation(value = "更新店铺信息", notes = "根据参数是否有id值，执行更新。有id为修改对应的店铺数据，无id为添加该店铺数据")
    public AjaxResult saveOrUpdate(@RequestBody Shop shop) {
        try {
            // 如果参数中的id为空，那么就是添加数据
            if (shop.getId() == null) {
                shopService.save(shop);
            } else {
                // 如果参数中的id不为空，那么就是修改数据
                shopService.update(shop);
            }
            // 如果没有出现异常，就操作成功
            return AjaxResult.successWithMessage("操作成功");
        } catch (Exception e) {
            e.printStackTrace();
            return AjaxResult.failedWithMessage(e.getMessage());
        }
    }

    /**
     * 批量删除数据
     * @param ids 前端传入的多个id的数组
     * @return 返回对应的Ajax请求结果
     */
    @PatchMapping
    public AjaxResult batchRemove(@RequestBody List<Long> ids) {
        System.out.println(ids);
        try {
            // 执行批量删除命令
            shopService.batchRemove(ids);
            // 如果没有发生异常，表示删除成功
            return AjaxResult.successWithMessage("批量操作成功");
        } catch (Exception e) {
            e.printStackTrace();
            // 如果发生异常，表示操作失败
            return AjaxResult.failedWithMessage(e.getMessage());
        }
    }

    /**
     * 店铺入驻注册
     * @param shop 注册的店铺信息
     * @return 返回注册结果状态
     */
    @PostMapping("/settlement")
    public AjaxResult shopRegister(@RequestBody Shop shop) {
        try {
            // 执行注册命令
            shopService.shopRegister(shop);
            // 如果没有出现异常的话，代表注册成功
            return AjaxResult.successWithMessage("注册成功");
        } catch (Exception e) {
            e.printStackTrace();
            // 如果出现异常,表示注册失败
            return AjaxResult.failedWithMessage(e.getMessage());
        }
    }


}
